package com.agnes.network.util;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * Desc:   解决解析泛型擦除的问题
 * Creator ling
 * Date:   2017/9/13 0013 10:46
 */

public class GsonRespParser implements ParameterizedType {

    private Class rawClazz;
    private Type[] args;

    public GsonRespParser(Class rawClazz, Type[] args) {
        this.rawClazz = rawClazz;
        this.args = args != null ? args : new Type[0];
    }


    @Override
    public Type[] getActualTypeArguments() {
//        Class clz = this.getClass();
//        //这里必须注意在外面使用new GsonResponsePasare<GsonResponsePasare.DataInfo>(){};
//        //实例化时必须带上{},否则获取到的superclass为Object
//        Type superclass = clz.getGenericSuperclass(); // 获得带有泛型的父类
//        if (superclass instanceof Class) {
//            throw new RuntimeException("Missing type parameter.");
//        }
//        ParameterizedType parameterizedType = (ParameterizedType) superclass;
//        return parameterizedType.getActualTypeArguments();
        return args;
    }

    @Override
    public Type getRawType() {
        return rawClazz;
    }

    @Override
    public Type getOwnerType() {
        return null;
    }


//    注：
//            1.直接采用new GsonResponsePasare<GsonResponsePasare.DataInfo>(){};方式解析json数据时，务必不要忽略最后的{}部分。
//            2.CommonResponse若为内部类，必须申明为static类型，否则会提示
//    java.lang.IllegalArgumentException
//    at com.google.gson.internal.$Gson$Preconditions.checkArgument($Gson$Preconditions.java:46)
//    at com.google.gson.internal.$Gson$Types$ParameterizedTypeImpl.<init>($Gson$Types.java:448)
//    at com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:103)
//    at com.google.gson.reflect.TypeToken.<init>(TypeToken.java:72)
//    at com.google.gson.reflect.TypeToken.get(TypeToken.java:296)
//    at com.google.gson.Gson.fromJson(Gson.java:877)
//    at com.google.gson.Gson.fromJson(Gson.java:844)
//    at com.google.gson.Gson.fromJson(Gson.java:793)...
//
//
/**
 * Type gsonType = new ParameterizedType() {//...};//不建议该方式，推荐采用GsonResponsePasare实现ParameterizedType.
 *   因为getActualTypeArguments这里涉及获取GsonResponsePasare的泛型集合
 * 调用：     ResultEntity<T> entity = new GsonRespParser<T>() {}.parse(s);
 * @param response
 * @return
 */
//    public ResultEntity<T> parse(String response) {
//        Type gsonTyep = this;
//        return new Gson().fromJson(response, gsonTyep);
//    }


//    /**
//     * 此种方式，获取的data 并非期望的实体类型，而是LinkedTreeMap类型，此处会提示强制异常；
//     * 用此种方式必须 传入具体的类型
//     */
//    public static <T> ResultEntity<T> toBean(String str) {
//        if (JsonUtils.isJOFormat(str)) {
//            Type objectType = new TypeToken<ResultEntity<T>>() {
//            }.getType();
//            return new Gson().fromJson(str, objectType);
//        }
//        return null;
//    }
}
